package com.example.demo.redis.repository;

import com.example.demo.model.Material;
import com.example.demo.redis.mapper.RedisTestMapper;
import com.example.demo.util.Result;
import com.example.demo.util.ResultVo;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

import java.util.List;
import java.util.concurrent.TimeUnit;

/**
 * Created by 86151 on 2018/12/27.
 */
@Component
public class RedisTestRepository {
    @Autowired
    private RedisTestMapper redisTestMapper;

    @Autowired
    private RedisTemplate redisTemplate;

    public List<Material> queryMaterial(Integer id) {
       String redisKey= "queryMaterial"+id;
//        redisTemplate.opsForValue().set("queryMaterial",materials);
        //当请求过来之后，先判断redis缓存中有没有数据，如果存在就在redis中取数据
        //set方法是新增缓存数据，第一个参数是key值，第二个是value值，第三个是缓存时间，第四个是缓存时间的单位
        //
//        key value 1 xiaoming
        List<Material> queryMaterial = (List<Material>)redisTemplate.opsForValue().get(redisKey);
        if (queryMaterial==null){
            synchronized (this){
                //从redis获取一下数据
                queryMaterial = (List<Material>)redisTemplate.opsForValue().get(redisKey);
                if (queryMaterial==null){
                    System.out.println("我操作数据库了！");
                    queryMaterial = redisTestMapper.queryMarterial(id);
                    //给缓存中的key赋值
                    redisTemplate.opsForValue().set(redisKey,queryMaterial,10000, TimeUnit.MILLISECONDS);
                }
            }
        }else {
            System.out.println("我操作的是缓存数据！");
        }
        //如果不存在，就操作数据库，并且把数据放入到redis缓存当中
        return queryMaterial;
    }
    public Material  updateRedis(Material material) {
       String redisKey= "queryMaterial"+material.getId();
       //1.先修改数据库中的数据
        redisTestMapper.updateMaterial(material);
        // 2.修改玩数据库中的数据后修改redis缓存中的数据。
       Material queryMaterial = redisTestMapper.queryMarterialById(material.getId());
       redisTemplate.opsForValue().set(redisKey,queryMaterial);
        return material;
    }
    public Material  deleteRedis(Integer id) {
       String redisKey= "queryMaterial"+id;
       //1.先删除数据库中的数据
        redisTestMapper.deleteMaterial(id);
        // 2.根据key删除缓存中的数据
       redisTemplate.delete(redisKey);
        Material material = new Material();
        return material;
    }




}
